{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# happybank——LightGBM\n",
    "原始特征\n",
    "boosting_type参数取值goss"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 首先 import 必要的模块\n",
    "import pandas as pd \n",
    "import numpy as np\n",
    "\n",
    "import lightgbm as lgbm\n",
    "from lightgbm.sklearn import LGBMClassifier\n",
    "\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 读取数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "scrolled": false
   },
   "outputs": [],
   "source": [
    "# 读取数据\n",
    "train = pd.read_csv(\"FE_train.csv\")\n",
    "\n",
    "y_train = train['Disbursed'] \n",
    "X_train = train.drop([\"ID\", \"Disbursed\"], axis=1)\n",
    "\n",
    "#保存特征名字以备后用（可视化）\n",
    "feat_names = X_train.columns "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## LightGBM超参数调优"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "LightGBM的主要的超参包括：\n",
    "1. 树的数目n_estimators 和 学习率 learning_rate\n",
    "2. 树的最大深度max_depth 和 树的最大叶子节点数目num_leaves（注意：XGBoost只有max_depth，LightGBM采用叶子优先的方式生成树，num_leaves很重要，设置成比 2^max_depth 小）\n",
    "3. 叶子结点的最小样本数:min_data_in_leaf(min_data, min_child_samples)\n",
    "4. 每棵树的列采样比例：feature_fraction/colsample_bytree\n",
    "5. 每棵树的行采样比例：bagging_fraction （需同时设置bagging_freq=1）/subsample\n",
    "6. 正则化参数lambda_l1(reg_alpha), lambda_l2(reg_lambda)\n",
    "\n",
    "7. 两个非模型复杂度参数，但会影响模型速度和精度。可根据特征取值范围和样本数目修改这两个参数\n",
    "1）特征的最大bin数目max_bin：默认255；\n",
    "2）用来建立直方图的样本数目subsample_for_bin：默认200000。\n",
    "\n",
    "对n_estimators，用LightGBM内嵌的cv函数调优，因为同XGBoost一样，LightGBM学习的过程内嵌了cv，速度极快。\n",
    "其他参数用GridSearchCV"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "MAX_ROUNDS = 10000"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 相同的交叉验证分组"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "# prepare cross validation\n",
    "from sklearn.model_selection import StratifiedKFold\n",
    "\n",
    "kfold = StratifiedKFold(n_splits=3, shuffle=True, random_state=3)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 1. n_estimators"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "#直接调用lightgbm内嵌的交叉验证(cv)，可对连续的n_estimators参数进行快速交叉验证\n",
    "#而GridSearchCV只能对有限个参数进行交叉验证，且速度相对较慢\n",
    "def get_n_estimators(params , X_train , y_train , early_stopping_rounds=10):\n",
    "    lgbm_params = params.copy()\n",
    "     \n",
    "    lgbmtrain = lgbm.Dataset(X_train , y_train)\n",
    "     \n",
    "    #num_boost_round为弱分类器数目，下面的代码参数里因为已经设置了early_stopping_rounds\n",
    "    #即性能未提升的次数超过过早停止设置的数值，则停止训练\n",
    "    cv_result = lgbm.cv(lgbm_params ,lgbmtrain , num_boost_round=MAX_ROUNDS , nfold=3,  metrics='auc' , early_stopping_rounds=early_stopping_rounds,seed=3 )\n",
    "     \n",
    "    print('best n_estimators:' , len(cv_result['auc-mean']))\n",
    "    print('best cv score:' , cv_result['auc-mean'][-1])\n",
    "     \n",
    "    return len(cv_result['auc-mean'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 87020 entries, 0 to 87019\n",
      "Data columns (total 22 columns):\n",
      " #   Column                 Non-Null Count  Dtype  \n",
      "---  ------                 --------------  -----  \n",
      " 0   Gender                 87020 non-null  int64  \n",
      " 1   City                   87020 non-null  int64  \n",
      " 2   Monthly_Income         87020 non-null  int64  \n",
      " 3   Loan_Amount_Applied    87020 non-null  float64\n",
      " 4   Loan_Tenure_Applied    87020 non-null  float64\n",
      " 5   Existing_EMI           87020 non-null  float64\n",
      " 6   Employer_Name          87020 non-null  int64  \n",
      " 7   Salary_Account         87020 non-null  int64  \n",
      " 8   Mobile_Verified        87020 non-null  int64  \n",
      " 9   Var5                   87020 non-null  int64  \n",
      " 10  Var1                   87020 non-null  int64  \n",
      " 11  Loan_Amount_Submitted  87020 non-null  float64\n",
      " 12  Loan_Tenure_Submitted  87020 non-null  float64\n",
      " 13  Interest_Rate          87020 non-null  float64\n",
      " 14  Processing_Fee         87020 non-null  float64\n",
      " 15  EMI_Loan_Submitted     87020 non-null  float64\n",
      " 16  Filled_Form            87020 non-null  int64  \n",
      " 17  Device_Type            87020 non-null  int64  \n",
      " 18  Var2                   87020 non-null  int64  \n",
      " 19  Source                 87020 non-null  int64  \n",
      " 20  Var4                   87020 non-null  int64  \n",
      " 21  Age                    87020 non-null  int64  \n",
      "dtypes: float64(8), int64(14)\n",
      "memory usage: 14.6 MB\n"
     ]
    }
   ],
   "source": [
    "X_train.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\Administrator\\anaconda3\\envs\\tf1.14\\lib\\site-packages\\lightgbm\\basic.py:794: UserWarning: categorical_feature keyword has been found in `params` and will be ignored.\n",
      "Please use categorical_feature argument of the Dataset constructor to pass this parameter.\n",
      "  .format(key))\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "best n_estimators: 71\n",
      "best cv score: 0.8033699749269158\n"
     ]
    }
   ],
   "source": [
    "params = {'boosting_type': 'goss',\n",
    "          'objective': 'binary',\n",
    "          'is_unbalance':True,\n",
    "          'n_jobs': 4,\n",
    "          'categorical_feature': [0,1,6,7,8,10,16,17,18,19,20],\n",
    "          'learning_rate': 0.1,\n",
    "          'num_leaves': 60,\n",
    "          'max_depth': 6,\n",
    "          'colsample_bytree': 0.7,\n",
    "         }\n",
    "#categorical_feature = ['City', 'Employer_Name', 'Salary_Account','Device_Type','Filled_Form','Gender','Mobile_Verified','Source','Var1','Var2','Var4']\n",
    "n_estimators_1 = get_n_estimators(params , X_train , y_train)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2. num_leaves & max_depth=6\n",
    "num_leaves建议70-80，搜索区间50-80,值越大模型越复杂，越容易过拟合\n",
    "相应的扩大max_depth=7"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 3 folds for each of 4 candidates, totalling 12 fits\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=4)]: Using backend LokyBackend with 4 concurrent workers.\n",
      "[Parallel(n_jobs=4)]: Done   8 out of  12 | elapsed:    8.1s remaining:    4.0s\n",
      "[Parallel(n_jobs=4)]: Done  12 out of  12 | elapsed:   10.4s finished\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=StratifiedKFold(n_splits=3, random_state=3, shuffle=True),\n",
       "             error_score=nan,\n",
       "             estimator=LGBMClassifier(boosting_type='goss',\n",
       "                                      categorical_feature=[0, 1, 6, 7, 8, 10,\n",
       "                                                           16, 17, 18, 19, 20],\n",
       "                                      class_weight=None, colsample_bytree=0.7,\n",
       "                                      importance_type='split',\n",
       "                                      is_unbalance=True, learning_rate=0.1,\n",
       "                                      max_depth=6, min_child_samples=20,\n",
       "                                      min_child_weight=0.001,\n",
       "                                      min_split_gain=0.0, n_estimators=71,\n",
       "                                      n_jobs=4, num_leaves=31,\n",
       "                                      objective='binary', random_state=None,\n",
       "                                      reg_alpha=0.0, reg_lambda=0.0,\n",
       "                                      silent=False, subsample=1.0,\n",
       "                                      subsample_for_bin=200000,\n",
       "                                      subsample_freq=0),\n",
       "             iid='deprecated', n_jobs=4,\n",
       "             param_grid={'num_leaves': range(50, 90, 10)},\n",
       "             pre_dispatch='2*n_jobs', refit=False, return_train_score=False,\n",
       "             scoring='roc_auc', verbose=5)"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "params = {'boosting_type': 'goss',\n",
    "          'objective': 'binary',\n",
    "          'is_unbalance':True,\n",
    "          'n_jobs': 4,\n",
    "          'categorical_feature': [0,1,6,7,8,10,16,17,18,19,20],\n",
    "          'n_estimators':n_estimators_1,\n",
    "          'learning_rate': 0.1,\n",
    "          'max_depth': 6,\n",
    "          'colsample_bytree': 0.7,\n",
    "         }\n",
    "lg = LGBMClassifier(silent=False,  **params)\n",
    "\n",
    "num_leaves_s = range(50,90,10) #50,60,70,80\n",
    "tuned_parameters = dict( num_leaves = num_leaves_s)\n",
    "\n",
    "grid_search = GridSearchCV(lg, n_jobs=4, param_grid=tuned_parameters, cv = kfold, scoring=\"roc_auc\", verbose=5, refit = False)\n",
    "grid_search.fit(X_train , y_train)\n",
    "#grid_search.best_estimator_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.805720607596723\n",
      "{'num_leaves': 60}\n"
     ]
    }
   ],
   "source": [
    "# examine the best model\n",
    "print(grid_search.best_score_)\n",
    "print(grid_search.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# plot CV误差曲线\n",
    "test_means = grid_search.cv_results_[ 'mean_test_score' ]\n",
    "test_stds = grid_search.cv_results_[ 'std_test_score' ]\n",
    "\n",
    "n_leafs = len(num_leaves_s)\n",
    "\n",
    "x_axis = num_leaves_s\n",
    "plt.plot(x_axis, test_means)\n",
    "#plt.errorbar(x_axis, -test_means, yerr=test_stds,label = ' Test')\n",
    "#plt.errorbar(x_axis, -train_means, yerr=train_stds,label = ' Train')\n",
    "plt.xlabel( 'num_leaves' )\n",
    "plt.ylabel( 'AUC' )\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.80508479, 0.80572061, 0.80510289, 0.80510289])"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test_means"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 取60, 不必再细调"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3. min_child_samples\n",
    "叶子节点的最小样本数目\n",
    "\n",
    "叶子节点数目：70，共9类，平均每类8个叶子节点\n",
    "每棵树的样本数目数目最少的类（稀有事件）的样本数目：200 * 2/3 * 0.7 = 100\n",
    "所以每个叶子节点约100/8 = 12个样本点\n",
    "\n",
    "搜索范围：10-50"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 3 folds for each of 5 candidates, totalling 15 fits\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=4)]: Using backend LokyBackend with 4 concurrent workers.\n",
      "[Parallel(n_jobs=4)]: Done  12 out of  15 | elapsed:    8.7s remaining:    2.1s\n",
      "[Parallel(n_jobs=4)]: Done  15 out of  15 | elapsed:   10.5s finished\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=StratifiedKFold(n_splits=3, random_state=3, shuffle=True),\n",
       "             error_score=nan,\n",
       "             estimator=LGBMClassifier(boosting_type='goss',\n",
       "                                      categorical_feature=[0, 1, 6, 7, 8, 10,\n",
       "                                                           16, 17, 18, 19, 20],\n",
       "                                      class_weight=None, colsample_bytree=0.7,\n",
       "                                      importance_type='split',\n",
       "                                      is_unbalance=True, learning_rate=0.1,\n",
       "                                      max_depth=6, min_child_samples=20,\n",
       "                                      min_child_weight=0.001,\n",
       "                                      min_split_gain=0.0, n_estimators=71,\n",
       "                                      n_jobs=4, num_leaves=60,\n",
       "                                      objective='binary', random_state=None,\n",
       "                                      reg_alpha=0.0, reg_lambda=0.0,\n",
       "                                      silent=False, subsample=1.0,\n",
       "                                      subsample_for_bin=200000,\n",
       "                                      subsample_freq=0),\n",
       "             iid='deprecated', n_jobs=4,\n",
       "             param_grid={'min_child_samples': range(10, 60, 10)},\n",
       "             pre_dispatch='2*n_jobs', refit=False, return_train_score=False,\n",
       "             scoring='roc_auc', verbose=5)"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "params = {'boosting_type': 'goss',\n",
    "          'objective': 'binary',\n",
    "          'is_unbalance':True,\n",
    "          'n_jobs': 4,\n",
    "          'categorical_feature': [0,1,6,7,8,10,16,17,18,19,20],\n",
    "          'learning_rate': 0.1,\n",
    "          'n_estimators':n_estimators_1,\n",
    "          'num_leaves': 60,\n",
    "          'max_depth': 6,\n",
    "          'colsample_bytree': 0.7,\n",
    "         }\n",
    "lg = LGBMClassifier(silent=False,  **params)\n",
    "\n",
    "min_child_samples_s = range(10,60,10) \n",
    "tuned_parameters = dict( min_child_samples = min_child_samples_s)\n",
    "\n",
    "grid_search = GridSearchCV(lg, n_jobs=4,  param_grid=tuned_parameters, cv = kfold, scoring=\"roc_auc\", verbose=5, refit = False)\n",
    "grid_search.fit(X_train , y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.8060027877280573\n",
      "{'min_child_samples': 40}\n"
     ]
    }
   ],
   "source": [
    "# examine the best model\n",
    "print(grid_search.best_score_)\n",
    "print(grid_search.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# plot CV误差曲线\n",
    "test_means = grid_search.cv_results_[ 'mean_test_score' ]\n",
    "test_stds = grid_search.cv_results_[ 'std_test_score' ]\n",
    "\n",
    "x_axis = min_child_samples_s\n",
    "\n",
    "plt.plot(x_axis, test_means)\n",
    "#plt.errorbar(x_axis, -test_scores, yerr=test_stds ,label = ' Test')\n",
    "#plt.errorbar(x_axis, -train_scores, yerr=train_stds,label =  +' Train')\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.80177351, 0.80572061, 0.80494144, 0.80600279, 0.80479419])"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test_means"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### min_child_samples=40"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 列采样参数 sub_feature/feature_fraction/colsample_bytree"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 3 folds for each of 5 candidates, totalling 15 fits\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=4)]: Using backend LokyBackend with 4 concurrent workers.\n",
      "[Parallel(n_jobs=4)]: Done  12 out of  15 | elapsed:   11.2s remaining:    2.7s\n",
      "[Parallel(n_jobs=4)]: Done  15 out of  15 | elapsed:   13.0s finished\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=StratifiedKFold(n_splits=3, random_state=3, shuffle=True),\n",
       "             error_score=nan,\n",
       "             estimator=LGBMClassifier(boosting_type='goss',\n",
       "                                      categorical_feature=[0, 1, 6, 7, 8, 10,\n",
       "                                                           16, 17, 18, 19, 20],\n",
       "                                      class_weight=None, colsample_bytree=1.0,\n",
       "                                      importance_type='split',\n",
       "                                      is_unbalance=True, learning_rate=0.1,\n",
       "                                      max_depth=6, min_child_samples=40,\n",
       "                                      min_child_weight=0.001,\n",
       "                                      min_split_gain=0.0, n_estimators=71,\n",
       "                                      n_jobs=4, num_leaves=60,\n",
       "                                      objective='binary', random_state=None,\n",
       "                                      reg_alpha=0.0, reg_lambda=0.0,\n",
       "                                      silent=False, subsample=1.0,\n",
       "                                      subsample_for_bin=200000,\n",
       "                                      subsample_freq=0),\n",
       "             iid='deprecated', n_jobs=4,\n",
       "             param_grid={'colsample_bytree': [0.5, 0.6, 0.7, 0.8, 0.9]},\n",
       "             pre_dispatch='2*n_jobs', refit=False, return_train_score=False,\n",
       "             scoring='roc_auc', verbose=5)"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "params = {'boosting_type': 'goss',\n",
    "          'objective': 'binary',\n",
    "          'is_unbalance':True,\n",
    "          'n_jobs': 4,\n",
    "          'categorical_feature': [0,1,6,7,8,10,16,17,18,19,20],\n",
    "          'learning_rate': 0.1,\n",
    "          'n_estimators':n_estimators_1,\n",
    "          'num_leaves': 60,\n",
    "          'max_depth': 6,\n",
    "          'min_child_samples':40\n",
    "         }\n",
    "lg = LGBMClassifier(silent=False,  **params)\n",
    "\n",
    "colsample_bytree_s = [i/10.0 for i in range(5,10)]\n",
    "tuned_parameters = dict( colsample_bytree = colsample_bytree_s)\n",
    "\n",
    "grid_search = GridSearchCV(lg, n_jobs=4,  param_grid=tuned_parameters, cv = kfold, scoring=\"roc_auc\", verbose=5, refit = False)\n",
    "grid_search.fit(X_train , y_train)\n",
    "#grid_search.best_estimator_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.8224110125285867\n",
      "{'colsample_bytree': 0.9}\n"
     ]
    }
   ],
   "source": [
    "# examine the best model\n",
    "print(grid_search.best_score_)\n",
    "print(grid_search.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# plot CV误差曲线\n",
    "test_means = grid_search.cv_results_[ 'mean_test_score' ]\n",
    "test_stds = grid_search.cv_results_[ 'std_test_score' ]\n",
    "\n",
    "\n",
    "x_axis = colsample_bytree_s\n",
    "\n",
    "plt.plot(x_axis, test_means)\n",
    "#plt.errorbar(x_axis, -test_scores[:,i], yerr=test_stds[:,i] ,label = str(max_depths[i]) +' Test')\n",
    "#plt.errorbar(x_axis, -train_scores[:,i], yerr=train_stds[:,i] ,label = str(max_depths[i]) +' Train')\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "再调小一点"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 3 folds for each of 4 candidates, totalling 12 fits\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=4)]: Using backend LokyBackend with 4 concurrent workers.\n",
      "[Parallel(n_jobs=4)]: Done   8 out of  12 | elapsed:    5.2s remaining:    2.5s\n",
      "[Parallel(n_jobs=4)]: Done  12 out of  12 | elapsed:    7.4s finished\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=StratifiedKFold(n_splits=3, random_state=3, shuffle=True),\n",
       "             error_score=nan,\n",
       "             estimator=LGBMClassifier(boosting_type='goss',\n",
       "                                      categorical_feature=[0, 1, 6, 7, 8, 10,\n",
       "                                                           16, 17, 18, 19, 20],\n",
       "                                      class_weight=None, colsample_bytree=1.0,\n",
       "                                      importance_type='split',\n",
       "                                      is_unbalance=True, learning_rate=0.1,\n",
       "                                      max_depth=6, min_child_samples=40,\n",
       "                                      min_child_weight=0.001,\n",
       "                                      min_split_gain=0.0, n_estimators=71,\n",
       "                                      n_jobs=4, num_leaves=60,\n",
       "                                      objective='binary', random_state=None,\n",
       "                                      reg_alpha=0.0, reg_lambda=0.0,\n",
       "                                      silent=False, subsample=1.0,\n",
       "                                      subsample_for_bin=200000,\n",
       "                                      subsample_freq=0),\n",
       "             iid='deprecated', n_jobs=4,\n",
       "             param_grid={'colsample_bytree': [0.2, 0.3, 0.4, 0.5]},\n",
       "             pre_dispatch='2*n_jobs', refit=False, return_train_score=False,\n",
       "             scoring='roc_auc', verbose=5)"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "params = {'boosting_type': 'goss',\n",
    "          'objective': 'binary',\n",
    "          'is_unbalance':True,\n",
    "          'n_jobs': 4,\n",
    "          'categorical_feature': [0,1,6,7,8,10,16,17,18,19,20],\n",
    "          'learning_rate': 0.1,\n",
    "          'n_estimators':n_estimators_1,\n",
    "          'num_leaves': 60,\n",
    "          'max_depth': 6,\n",
    "          'min_child_samples':40\n",
    "         }\n",
    "lg = LGBMClassifier(silent=False,  **params)\n",
    "\n",
    "colsample_bytree_s = [i/10.0 for i in range(2,6)]\n",
    "tuned_parameters = dict( colsample_bytree = colsample_bytree_s)\n",
    "\n",
    "grid_search = GridSearchCV(lg, n_jobs=4,  param_grid=tuned_parameters, cv = kfold, scoring=\"roc_auc\", verbose=5, refit = False)\n",
    "grid_search.fit(X_train , y_train)\n",
    "#grid_search.best_estimator_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.8202262312830407\n",
      "{'colsample_bytree': 0.4}\n"
     ]
    }
   ],
   "source": [
    "# examine the best model\n",
    "print(grid_search.best_score_)\n",
    "print(grid_search.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# plot CV误差曲线\n",
    "test_means = grid_search.cv_results_[ 'mean_test_score' ]\n",
    "test_stds = grid_search.cv_results_[ 'std_test_score' ]\n",
    "\n",
    "\n",
    "x_axis = colsample_bytree_s\n",
    "\n",
    "plt.plot(x_axis, test_means)\n",
    "#plt.errorbar(x_axis, -test_scores[:,i], yerr=test_stds[:,i] ,label = str(max_depths[i]) +' Test')\n",
    "#plt.errorbar(x_axis, -train_scores[:,i], yerr=train_stds[:,i] ,label = str(max_depths[i]) +' Train')\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### colsample_bytree=0.4"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 正则化参数lambda_l1(reg_alpha), lambda_l2(reg_lambda)感觉不用调了"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 减小学习率，调整n_estimators"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\Administrator\\anaconda3\\envs\\tf1.14\\lib\\site-packages\\lightgbm\\basic.py:794: UserWarning: categorical_feature keyword has been found in `params` and will be ignored.\n",
      "Please use categorical_feature argument of the Dataset constructor to pass this parameter.\n",
      "  .format(key))\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "best n_estimators: 65\n",
      "best cv score: 0.8308308147939417\n"
     ]
    }
   ],
   "source": [
    "params = {'boosting_type': 'goss',\n",
    "          'objective': 'binary',\n",
    "          'is_unbalance':True,\n",
    "          'n_jobs': 4,\n",
    "          'categorical_feature': [0,1,6,7,8,10,16,17,18,19,20],\n",
    "          'learning_rate': 0.01,\n",
    "          'num_leaves': 60,\n",
    "          'max_depth': 6,\n",
    "          'min_child_samples':40,\n",
    "          'colsample_bytree': 0.4,\n",
    "         }\n",
    "#categorical_feature = ['City', 'Employer_Name', 'Salary_Account','Device_Type','Filled_Form','Gender','Mobile_Verified','Source','Var1','Var2','Var4']\n",
    "n_estimators_2 = get_n_estimators(params , X_train , y_train)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### 用所有训练数据，采用最佳参数重新训练模型\n",
    "由于样本数目增多，模型复杂度稍微扩大一点？\n",
    "num_leaves增多5\n",
    "#min_child_samples按样本比例增加到50"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\Administrator\\anaconda3\\envs\\tf1.14\\lib\\site-packages\\lightgbm\\basic.py:794: UserWarning: categorical_feature keyword has been found in `params` and will be ignored.\n",
      "Please use categorical_feature argument of the Dataset constructor to pass this parameter.\n",
      "  .format(key))\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "LGBMClassifier(boosting_type='goss',\n",
       "               categorical_feature=[0, 1, 6, 7, 8, 10, 16, 17, 18, 19, 20],\n",
       "               class_weight=None, colsample_bytree=0.4, importance_type='split',\n",
       "               is_unbalance=True, learning_rate=0.01, max_depth=6,\n",
       "               min_child_samples=50, min_child_weight=0.001, min_split_gain=0.0,\n",
       "               n_estimators=65, n_jobs=4, num_leaves=65, objective='binary',\n",
       "               random_state=None, reg_alpha=0.0, reg_lambda=0.0, silent=False,\n",
       "               subsample=1.0, subsample_for_bin=200000, subsample_freq=0)"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "params = {'boosting_type': 'goss',\n",
    "          'objective': 'binary',\n",
    "          'is_unbalance':True,\n",
    "          'n_jobs': 4,\n",
    "          'categorical_feature': [0,1,6,7,8,10,16,17,18,19,20],\n",
    "          'learning_rate': 0.01,\n",
    "          'n_estimators':n_estimators_2,\n",
    "          'num_leaves': 65,\n",
    "          'max_depth': 6,\n",
    "          'min_child_samples':50,\n",
    "          'colsample_bytree': 0.4,\n",
    "         }\n",
    "lg = LGBMClassifier(silent=False,  **params)\n",
    "lg.fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 保存模型，用于后续测试"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pickle\n",
    "\n",
    "pickle.dump(lg, open(\"HappyBank_LightGBM_goss_org.pkl\", 'wb'))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 特征重要性"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [],
   "source": [
    "df = pd.DataFrame({\"columns\":list(feat_names), \"importance\":list(lg.feature_importances_.T)})\n",
    "df = df.sort_values(by=['importance'],ascending=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>columns</th>\n",
       "      <th>importance</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Monthly_Income</td>\n",
       "      <td>412</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Loan_Amount_Applied</td>\n",
       "      <td>287</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>Existing_EMI</td>\n",
       "      <td>270</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>Var5</td>\n",
       "      <td>260</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>21</th>\n",
       "      <td>Age</td>\n",
       "      <td>259</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>Interest_Rate</td>\n",
       "      <td>238</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>Loan_Amount_Submitted</td>\n",
       "      <td>207</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>Processing_Fee</td>\n",
       "      <td>175</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>EMI_Loan_Submitted</td>\n",
       "      <td>172</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>City</td>\n",
       "      <td>136</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>Loan_Tenure_Applied</td>\n",
       "      <td>121</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>Salary_Account</td>\n",
       "      <td>120</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>Employer_Name</td>\n",
       "      <td>117</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>Loan_Tenure_Submitted</td>\n",
       "      <td>100</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>Source</td>\n",
       "      <td>94</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>Mobile_Verified</td>\n",
       "      <td>60</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Gender</td>\n",
       "      <td>58</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20</th>\n",
       "      <td>Var4</td>\n",
       "      <td>49</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>Var1</td>\n",
       "      <td>46</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>Filled_Form</td>\n",
       "      <td>41</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17</th>\n",
       "      <td>Device_Type</td>\n",
       "      <td>37</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>Var2</td>\n",
       "      <td>15</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                  columns  importance\n",
       "2          Monthly_Income         412\n",
       "3     Loan_Amount_Applied         287\n",
       "5            Existing_EMI         270\n",
       "9                    Var5         260\n",
       "21                    Age         259\n",
       "13          Interest_Rate         238\n",
       "11  Loan_Amount_Submitted         207\n",
       "14         Processing_Fee         175\n",
       "15     EMI_Loan_Submitted         172\n",
       "1                    City         136\n",
       "4     Loan_Tenure_Applied         121\n",
       "7          Salary_Account         120\n",
       "6           Employer_Name         117\n",
       "12  Loan_Tenure_Submitted         100\n",
       "19                 Source          94\n",
       "8         Mobile_Verified          60\n",
       "0                  Gender          58\n",
       "20                   Var4          49\n",
       "10                   Var1          46\n",
       "16            Filled_Form          41\n",
       "17            Device_Type          37\n",
       "18                   Var2          15"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.bar(range(len(lg.feature_importances_)), lg.feature_importances_)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 这里得到的结果说明\n",
    "最终是否会购买该贷款产品，月收入影响最大，其次是贷款申请请求金额和现有贷款的EMI，\n",
    "而跟性别、是否移动验证、进行申请的设备、后期报价后是否已填写申请表格关系不大，符合常识，但是模型的准确率还需要提高"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
